Giới thiệu Semaphore (tin học)

Semaphore chỉ có thể được truy nhập bằng cách sử dụng các toán tử sau

P(Semaphore s){  chờ cho đến khi s > 0, rồi s:= s-1;  /* phải là toán tử nguyên tố (không bị chia cắt) một khi phát hiện được s > 0 */}V(Semaphore s){  s:= s+1;   /* phải là toán tử nguyên tố */}Init(Semaphore s, Integer v){  s:= v;}

Chú ý rằng việc tăng biến s không thể bị gián đoạn, và toán tử P cũng không được gián đoạn sau khi nhận ra biến s có giá trị khác 0. Điều này có thể được thực hiện bằng cách sử dụng một lệnh đặc biệt như test-and-set (kiểm tra và thiết lập) nếu tập lệnh của kiến trúc máy hiện hành hỗ trợ nó, hoặc bằng cách bỏ qua các ngắt để ngăn tiến trình khác kích hoạt (đối với các hệ thống chỉ có 1 bộ vi xử lý).

Các cái tên kinh điển P và V xuất phát từ tiếng Hà Lan. Chữ V trong verhoog nghĩa là "tăng". Một vài lời giải thích đưa ra cho chữ P (bao gồm passeer có nghĩa là "vượt qua", probeer có nghĩa là thử, và pakken với nghĩa "nắm lấy"), nhưng thực ra Dijkstra viết rằng ông dùng P để đại diện cho từ tự tạo portmanteau prolaag,[1] là viết tắt của probeer te verlagen, hay "kiểm-tra-để-giảm".[2][3].

Giá trị của một semaphore là số đơn vị tài nguyên đang ở trạng thái rỗi. (Nếu chỉ có một tài nguyên, người ta sẽ sử dụng một "semaphore nhị phân" với các giá trị 0 và 1.) Toán tử P đợi (busy waiting) hoặc đang ngủ cho đến khi một tài nguyên hết bận, khi đó, nó lập tức chiếm quyền sử dụng tài nguyên đó. V là toán tử đảo ngược; nó thả một tài nguyên sau khi tiến trình đã sử dụng xong tài nguyên đó. Init chỉ được dùng để khởi tạo semaphore trước tất cả các yêu cầu sử dụng nào. Các toán tử P và V phải có tính chất nguyên tố, nghĩa là không có tiến trình nào có thể chặn giữa quá trình thực hiện một trong các toán tử này để chạy một toán tử khác trên cùng một semaphore đó.

Trong các sách giáo trình tiếng Anh, và trong ngôn ngữ lập trình ALGOL 68, các toán tử P và V thường được gọi lần lượt là down và up. Trong các tài liệu công nghệ phần mềm, các toán tử này được gọi là wait (đợi) và signal (đánh tín hiệu), hoặc take (lấy) và release (thả), hoặc pend (giữ) và post (công bố).

Để tránh tình trạng busy-waiting, một semaphore có thể có một cấu trúc hàng đợi gồm các tiến trình. Nếu một tiến trình thực hiện một thao tác P đối với một semaphore có giá trị 0, tiến trình này được đưa vào hàng đợi của semaphore. Khi một tiến trình khác dùng toán tử V để tăng giá trị của semaphore, và có tiến trình nằm trong hàng đợi, thì một tiến trình trong đó được lấy ra khỏi hàng đợi và tiếp tục chạy.

Liên quan

Tài liệu tham khảo

WikiPedia: Semaphore (tin học) http://c2.com/cgi/wiki?SemaphoresForMutualExclusio... http://codeproject.com/csharp/inprocsemaphore.asp http://greenteapress.com/semaphores/ http://java.sun.com/j2se/1.5.0/docs/api/java/util/... http://cs.gmu.edu/cne/modules/ipc/ http://citeseer.ist.psu.edu/cis?q=semaphore http://www.cs.utexas.edu/users/EWD/ewd00xx/EWD74.P... http://www.cs.utexas.edu/users/EWD/transcriptions/... http://lkml.org/lkml/2005/12/19/34 http://www.opengroup.org/onlinepubs/009695399/base...